iT邦幫忙

2026 iThome 鐵人賽

DAY 12
0
Build on Google AI

30 天用 Google AI 打造台灣防災速報 App系列 第 29 篇

Day 29|成果展示:「防災速報」App 完整操作一次,與目前上架進度

  • 分享至 

  • xImage
  •  

系列:30 天用 Google AI 打造臺灣防災速報 App(Day 29/30)

今天照一般使用者會走的順序,把防災速報從打開到設定走一遍,功能後面標出在哪一篇介紹。以下是開發中版本的畫面與流程。先說現況:App 還沒上架,Google Play 封閉測試尚未開放,iOS 還沒送 App Store 審查;網頁版已經開放:https://ai-watchtower-tw.web.app。細節放在最後一節。

打開 App

  • 手機版從完全關閉的狀態打開時,有一段開場動畫,點一下就能略過。從 Android 推播通知打開時不播,直接進那則示警。
  • 底部四個分頁:示警、地震、災害問答、緊急協助。右上角是設定和語言選單。
  • 介面可以切換成繁體中文、English、日本語,預設跟著手機語言;手機語言不支援時用英文。中文一律是繁體(臺灣)。(Day 13、18)

Android、iOS、網頁版是同一個 Flutter(Google 的跨平台開發工具)專案建出來的(Day 18)。

示警分頁

首頁標題是「目前生效中的示警」,旁邊寫共幾則,下方寫資料同步時間。後端每 10 分鐘從國家災害防救科技中心的民生示警公開資料平台抓一次(Day 2、16)。

不同的資料狀態,畫面上分開標示(Day 19):

  • 後端超過 25 分鐘沒更新,同步時間後面加註資料可能不是最新。
  • 同步失敗時,顯示最後一次成功的時間。
  • 離線或只有快取時,顯示「尚未取得最新資料」或「目前顯示的是離線資料,可能不是最新狀態」。
  • 伺服器確認沒有示警,才會出現「目前沒有生效中的示警」。

篩選:

  • 分類:氣象、地震海嘯、水利、火災事故、交通、民生、其他(Day 5)。
  • 縣市依件數多寡排序。
  • 選項旁寫生效中的則數,0 則的分類不列。畫面放不下時改成兩個下拉選單。
  • 有篩選而結果是空的,顯示「沒有符合目前篩選的示警。」不說成沒有示警。

卡片:

  • 等級四級:極重大(紅)、重大(橙)、警戒(黃)、資訊(藍)(Day 9、21);另有未分級。
  • 等級以官方為先(Day 9、21、27)。示警原文(電文)用的是 CAP(Common Alerting Protocol,各國政府發布示警共用的標準格式)。判斷順序:
    1. 電文明寫紅色等級 → 極重大。
    2. 否則看 CAP 裡官方的嚴重程度欄位(severity),照表對應。
    3. 兩者都沒有,才由 Gemini 依分級表補判,最高到重大。
  • 過期的示警變灰、標「已過期」,排到列表最後(Day 19)。
  • 原始資料編號(id)相同的多則示警,例如多家醫院門診異動,合成一張卡,點開再列出每一則(Day 5、19)。
  • 卡片上直接顯示摘要。有 AI 摘要就用,沒有就顯示原文。
  • 最下方有收合的「過去 24 小時已結束」,展開時才讀取。可以下拉重新整理。

摘要只做給較長的示警。原文 60 字以內直接用原文;超過 60 字才交給 Gemini 的輕量模型 gemini-3.1-flash-lite 改寫。提示詞要求 60 字以內、不加原文沒有的提醒、不用驚嘆號(Day 8、27)。

注意:60 字是提示詞裡的要求,程式不截斷,所以仍可能超過 60 字(Day 27)。

程式另外做兩件事:

  • 摘要出現原文找不到的勸告句,就重寫一次;仍有,改用原文前段(Day 27)。
  • 原文提到海嘯的句子,摘要裡沒有的話,由程式照原文附在摘要後面。

示警詳情

點開一張卡,從上到下是:

  1. 標題卡:類型圖示、標題、等級標籤,左邊一條等級色條。
  2. 縣市地圖:App 自己畫的臺灣縣市圖,用國土測繪中心的縣市界線簡化而成。不載入線上地圖,斷網也能顯示。有官方各縣市等級時照各縣市上色,沒有時用整則的等級(Day 15)。
  3. 摘要:下面一行小字「AI 整理,內容以發布單位公告為準。」發布單位原文收合在「查看發布單位原文」。沒有 AI 摘要時直接顯示原文。
  4. 影響縣市:每個縣市後面另外寫出等級文字。地圖只靠顏色分等級,色覺障礙者不一定分得出來,所以用文字補上。
  5. 分類(大類/細類)、更新時間、有效至。
  6. 資料來源框:「(發布單位)發布,經國家災害防救科技中心(NCDR)示警平台取得。」
  7. 頁尾紅色「撥打 119」按鈕。

開著詳情時,示警如果被解除或內容更新,頁面會提示「這則示警已解除或內容已更新,請回到列表查看最新狀態。」停留期間過了有效期限,也會標已過期。

英文、日文介面(Day 13):

  • 摘要是後端翻好的版本,每種語言一個欄位。
  • 程式核對每種語言的數字,日文另外核對縣市寫法。重試一次仍不通過,就不採用這份翻譯,App 改顯示中文原文,並標出是原文。
  • 標題用分類的固定譯名。和原標題不同時,另列一行「原文標題」。

地震分頁

兩個子分頁:「近期地震」和「歷史地震地圖」。

近期地震:

  • 資料來自中央氣象署的「顯著有感地震報告」和「小區域有感地震報告」(Day 6),後端每 2 分鐘同步一次(Day 16)。
  • 卡片顯示最大震度、規模、地點、深度;小區域報告另標「小區域」。地名有外語譯文就用,沒有就顯示中文並標「原文」。
  • 列表固定附一句:地震報告要人工確認震度,通常發生後幾分鐘才發布,剛感覺到搖晃時這裡可能還沒有資料。
  • 注意:地震報告和強震即時警報是兩件事(Day 22)。
  • 列表下方依政府資料開放授權條款標示資料由中央氣象署提供,附條款連結;詳情頁寫明「資料來源:中央氣象署」。
  • 詳情頁上方是規模和最大震度(含縣市),接著是 Google 地圖。
  • 地圖一打開就同時框住臺灣本島和震央,震央在海上時不會整片是海。
  • 地圖下面列發生時間、震央(地名與座標)、深度、資料來源,以及氣象署地震報告的連結。

歷史地震地圖(Day 24):

  • 美國地質調查所(USGS)地震目錄中,1996–2026 年臺灣周邊規模 4.5 以上的地震,共 2,011 筆,資料打包在 App 裡。
  • 圓點大小代表規模,顏色代表深度(小於 30、30–70、大於 70 公里)。
  • 上方有滾輪可選最小規模(4.5 到 7.7,每格 0.1),旁邊顯示目前畫了幾筆。
  • 地圖說明寫明資料來源是 USGS。

讀圖時要注意(Day 24):USGS 和氣象署用的規模種類不同,同一個地震的數字可能不一樣,所以兩份資料分開顯示;圖上空白不代表那裡安全。

災害問答

頁面頂端固定一行告知:問題會上傳到雲端,由 Google Gemini 產生回答;畫面高度不夠時改成短版。點這一行可以看隱私說明。

問題最多 300 字。送出後顯示「正在查詢…」,等待時送出鈕停用。

後端先把問題分類,結果不顯示給使用者。從危機開始逐項比對,符合哪一類就停在那一類:危機(Day 20)→ 地震預測 → 情緒 → 防災知識 → 即時狀況。

即時狀況用查詢工具(模型沒呼叫工具時改查知識庫);地震預測回程式固定的說明;防災知識、情緒、危機查知識庫。情緒類要用哪幾段資料、順序怎麼排,由規則固定(Day 12)。

危機與情緒的判斷規則參考公開指引整理,還沒有經過心理專業人員審閱(Day 20)。

  • 即時狀況:模型可以呼叫兩個查詢函式(工具)。get_active_alerts 查生效示警,get_recent_quakes 查近期地震,兩個都只讀後端已同步進資料庫的資料,不另外即時連到外部(工具做法見 Day 10)。

    只查了示警而且查到 0 筆時,回答由程式給固定的一句:查不到不代表當地一定沒有示警,請以官方發布為準(Day 26)。

  • 知識庫:現在有 42 段官方防災資料(切成段落後存進知識庫),主題有地震、海嘯、災後心理、避難包、颱風、豪雨、淹水、停水、水庫放流、土石流、火災。用 gemini-embedding-2 把問題和每段資料各轉成一串數字(向量),算出兩者有多像;相似度低於 0.75 就當作沒找到(做法見 Day 11、12;情緒與危機類照固定順序取資料,不套用門檻)。沒過門檻就回「這部分我沒有可靠的資料」。

  • 回答:由 gemini-3.1-flash-lite 產生,只能用檢索到的資料或工具查到的結果。

  • 出處:依官方資料的回答會附上出處。有出處時,回答下方列「資料來源」,每個來源可以點開原網頁。來源清單由程式決定,不靠模型自己寫。

  • 地震預測:問「明天會不會地震」這類問題,回答是程式固定的說明:目前科學無法預測地震的時間、地點與規模。附氣象署地震百問連結,下方另有「查看防災準備」按鈕(Day 22、23)。

  • 危機:判成危機時,回答最上方先出現一鍵撥號按鈕,中文介面是 119 和 1925(安心專線)。之後輸入框上方固定一列求助專線按鈕,不隨捲動消失。求助文字由程式固定加在最前面,模型出錯時照樣出現(Day 20)。

危機專線依介面語言不同:英文介面是 119、1990(外來人士在臺生活諮詢服務熱線)、1925,1925 會標明只有華語服務;日文介面是 119、日本台灣交流協會台北事務所、1990、1925。各語言的危機回答都是 119 在第一位。

每則 AI 回答下方有「回報這則回答」。原因可選不正確、資訊過時或與官方不符、不恰當或冒犯、其他,也能補充說明。回報會把問題與回答傳給開發者;回報的內容不含 IP 和裝置識別碼,保存 90 天後自動刪除(保存期限見 Day 15)。

問答次數過多或服務失敗時,錯誤訊息都附一句「如有緊急狀況請撥 119」。

緊急協助與防災準備

緊急協助頁點卡片就直接撥號。中文介面依序是:

  • 緊急電話:119(消防、救護)、110(報案)。
  • 心理支持專線:1925 安心專線(24 小時)、1995 生命線、1980 張老師(兩支的時段都依各地不同)。
  • 最後是防災準備入口。

英文介面在「心理支持專線」這一區最前面加列 1990(外來人士在臺生活諮詢服務熱線,24 小時,可用外語)。1990 是生活諮詢,不是心理專線(Day 20)。

日文介面最上面另有一區「日本語での相談」(日語諮詢),列日本台灣交流協會台北事務所與 1990。

防災準備頁有兩個分頁:

  • 避難包清單:「清單」和「家中有這些成員時另外準備」兩組可以勾選。勾選狀態只存在這台裝置或這個瀏覽器,不上傳。
  • 災害應變:地震、颱風、海嘯、土石流、火災。

內容固定寫在 App 裡。每段下方標出處,可以點開官方原網頁,例如國防部全民防衛動員署、內政部消防署、中央氣象署。

防災準備頁另有急救知識區塊,還在等醫療專業人員確認,目前隱藏。

推播設定(Android)

位置在「設定 → 推播設定」(Day 25):

  • 縣市可以複選,也有全選。
  • 所選縣市的極重大示警不能關閉通知。這個做法參考國家級警報,但防災速報不是國家級警報的發送管道。
  • 「重大」可以開關,只限官方等級為重大。AI 判定為重大的,App 裡照樣以重大顯示,但不通知。
  • 警戒、資訊和地震報告不通知。
  • 同一縣市、同一等級、同一類別的示警,30 分鐘內最多通知一次;極重大不受這 30 分鐘限制。

其他細節:

  • 選了縣市才請求通知權限;沒選縣市的人打開 App 時不會跳權限視窗。權限被關掉時,頁面提醒到系統設定開啟。
  • 設定存在裝置上。所選縣市、等級和介面語言以「主題」形式登記在 Firebase 雲端通訊(FCM):裝置訂閱主題,後端對主題發訊息,訂閱的裝置都會收到。
  • 登記的內容不含姓名、電話,也不取得定位;後端不存裝置的推播識別碼。
  • 演習、測試、解除、已過期的電文不推。同一則示警後續的更新電文(更新鏈)裡,同一縣市推過就不再推,從重大升到極重大也一樣(Day 25)。
  • 通知文字只來自單一則示警,不讓 AI 把多則合成一則(Day 26)。
  • 點通知直接開到那則示警。先找生效中的,再找已結束的;都找不到就顯示「這則示警已結束。」正在用 App 時收到通知,畫面下方會出現提示列,點「查看」開詳情。

iOS 版的推播 10/13 已用 iPhone 接電腦的除錯版收到測試推播;一般使用者還裝不到 iOS 版。

設定頁

設定頁有五項:推播設定、關於我們、資料來源、隱私說明、開源授權。

  • 關於我們:寫明由個人開發,不是政府機關的服務,與資料來源機關沒有隸屬關係;緊急狀況請直接撥 119 或 110。防災速報和任何政府機關都沒有關聯。頁末「使用技術」寫的是:Google Cloud、Firebase、Google Maps、Gemini、Flutter、Google Antigravity(Google 的 AI 程式開發工具)。
  • 資料來源:示警(國家災害防救科技中心彙整的 CAP 公開資料)、地震(中央氣象署兩個資料集)、縣市界線(內政部國土測繪中心)、歷史地震地圖(USGS 目錄)、地震位置底圖(Google)。各附來源網頁,最後附政府資料開放授權條款。
  • 隱私說明:頁面寫的是:問答的問題送到 Google 的 Gemini 產生回答;後端不儲存問題內容,只記錄問題類型;App 不需要登入,不蒐集姓名、電話或位置;地圖載入時裝置會直接連到 Google。為了限制使用次數,後端只記錄來源 IP 經單向轉換後的代碼,無法直接還原,一段時間後失效。
    • 補充:日誌實際還記工具名稱、檢索分數等摘要;使用者主動回報的那一則會存下(Day 15、28)。

網頁版

網頁版沒有推播(Day 25),「關於我們」和隱私說明都有寫。

代替推播的是示警頁頂端的固定橫幅:「目前有 N 則重大以上示警,點此查看」。

  • 等級條件和推播一樣:極重大,或官方等級為重大;AI 判定的重大不算。橫幅不分縣市。
  • 有極重大時是紅底,並寫出「極重大」;否則是橙底。
  • 只有一則時,點了直接開詳情;多則時,清掉篩選、捲回列表頂端。
  • 資料可能不是最新時,橫幅上另外註明。

其他和手機版不同的地方:

  • 每頁有自己的網址:示警、地震、問答、緊急協助、防災準備、資料來源、隱私、關於。重新整理會停在原頁,連結可以分享。
  • 頁首選單把防災準備列成獨立項目;頁尾放關於我們、資料來源、隱私說明。
  • 文字可以選取複製。
  • 視窗寬度至少 840 像素時用雙欄:左邊列表、右邊詳情,點示警後詳情從右邊滑出。
  • 沒有開場動畫。

App 在夠寬的平板上(包括大尺寸平板直向)也用同樣的雙欄版面;手機橫向高度不夠,維持手機版面。

目前的狀況

  • 網頁版:10/13 已開放,https://ai-watchtower-tw.web.app
  • Android:後端 10/7 起正式發送 Android 重大示警推播。Google Play 開發者帳號 10/13 驗證通過,正在建立 App、準備送封閉測試審查,所以一般人目前還裝不到 Android 版。
  • iOS:TestFlight 測試版已送審,還沒送 App Store 審查;iPhone 接電腦的除錯版已收到測試推播,一般使用者還裝不到。
  • 雲端費用(開發端負擔):正式上架前每月約 2–3 美元。

想自己裝來用的話:防災速報正在準備上架 Google Play。重大示警會推播到 Android 手機。上架前,Google 要求測試者連續加入封閉測試 14 天。如果你有 Android 手機,歡迎先加入測試群組,封閉測試開放時會收到通知:

https://groups.google.com/g/watchtower-lab-testers

加入群組時,我會看到你的 Google 帳號名稱和 email,只用來管理測試名單,正式上架後30天內刪除群組。Google Play 會依群組名單開放你的帳號安裝測試版。iOS 版還沒上架。

今日小結

  • 四個分頁:示警看現在生效的,地震看報告和 1996 年以來的歷史地震,問答只用知識庫和已同步的資料回答、查不到就說沒有可靠資料,緊急協助直接撥號。
  • 資料狀態分開標示:離線、快取、同步逾時都標出來,不把拿不到資料說成沒有示警。
  • 等級以官方為先,AI 只補空缺,最高到重大。Android 推播只推極重大與官方等級的重大,地震不推。
  • 問答依官方資料的回答會附上出處;危機時的求助文字和地震預測的回答由程式固定。
  • 平台現況:Android 版還裝不到(封閉測試未開放),iOS 還沒上架,網頁版已開放,用頂端橫幅代替推播。

明天 Day 30:完賽回顧,也整理還沒做完的事。


上一篇
Day 28|正式環境一個月約 3 美元:費用、監控與資安的實際做法
下一篇
Day 30|完賽回顧:30 天做出的防災速報,和還沒做完的事
系列文
30 天用 Google AI 打造台灣防災速報 App 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言